#!/bin/bash

# SysY 词法分析器集成测试脚本
# 
# 该脚本自动运行所有集成测试用例，比较实际输出与期望输出
# 测试用例格式：tests/*.in (输入) 和 tests/*.out (期望输出)

set -e  # 遇到错误立即退出

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 获取项目根目录（脚本在 tests/ 目录下，所以项目根目录是上一级）
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# 测试目录
TESTS_DIR="$SCRIPT_DIR"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 统计变量
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0

echo -e "${BLUE}=== SysY 词法分析器集成测试 ===${NC}"
echo

# 确保项目已构建
echo -e "${YELLOW}构建项目...${NC}"
cd "$PROJECT_ROOT"
cargo build --release --quiet
if [ $? -ne 0 ]; then
    echo -e "${RED}构建失败！${NC}"
    exit 1
fi
echo -e "${GREEN}构建成功${NC}"
echo

# 创建临时目录存放实际输出
TEMP_DIR=$(mktemp -d)
trap "rm -rf $TEMP_DIR" EXIT

echo -e "${BLUE}运行测试用例...${NC}"
echo

# 遍历所有 .in 文件
for input_file in "$TESTS_DIR"/*.in; do
    if [ ! -f "$input_file" ]; then
        echo -e "${YELLOW}没有找到测试用例${NC}"
        continue
    fi
    
    # 获取测试用例名称（不含路径和扩展名）
    test_name=$(basename "$input_file" .in)
    expected_output="$TESTS_DIR/${test_name}.out"
    actual_output="$TEMP_DIR/${test_name}.actual"
    
    # 检查期望输出文件是否存在
    if [ ! -f "$expected_output" ]; then
        echo -e "${RED}❌ $test_name: 缺少期望输出文件 $expected_output${NC}"
        FAILED_TESTS=$((FAILED_TESTS + 1))
        TOTAL_TESTS=$((TOTAL_TESTS + 1))
        continue
    fi
    
    # 运行词法分析器
    echo -n "🔍 测试 $test_name ... "
    
    # 运行程序并捕获输出（包括 stderr）
    if timeout 10s "$PROJECT_ROOT/target/release/compiler" "$input_file" 2>"$actual_output"; then
        # 比较输出
        if diff -q "$expected_output" "$actual_output" >/dev/null 2>&1; then
            echo -e "${GREEN}✅ PASS${NC}"
            PASSED_TESTS=$((PASSED_TESTS + 1))
        else
            echo -e "${RED}❌ FAIL${NC}"
            echo -e "${RED}  期望输出与实际输出不匹配${NC}"
            echo -e "${YELLOW}  期望输出:${NC}"
            sed 's/^/    /' "$expected_output"
            echo -e "${YELLOW}  实际输出:${NC}"
            sed 's/^/    /' "$actual_output"
            echo -e "${YELLOW}  差异:${NC}"
            diff "$expected_output" "$actual_output" | sed 's/^/    /' || true
            echo
            FAILED_TESTS=$((FAILED_TESTS + 1))
        fi
    else
        echo -e "${RED}❌ FAIL (程序执行失败或超时)${NC}"
        echo -e "${YELLOW}  实际输出:${NC}"
        sed 's/^/    /' "$actual_output"
        echo
        FAILED_TESTS=$((FAILED_TESTS + 1))
    fi
    
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
done

echo
echo -e "${BLUE}=== 测试结果汇总 ===${NC}"
echo -e "总测试数: $TOTAL_TESTS"
echo -e "${GREEN}通过: $PASSED_TESTS${NC}"
echo -e "${RED}失败: $FAILED_TESTS${NC}"

if [ $FAILED_TESTS -eq 0 ]; then
    echo -e "${GREEN}🎉 所有测试通过！${NC}"
    exit 0
else
    echo -e "${RED}💥 有 $FAILED_TESTS 个测试失败${NC}"
    exit 1
fi